package br.com.mackinvest.action;

import java.util.HashMap;
import java.util.NoSuchElementException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import com.sun.corba.se.impl.orbutil.closure.Constant;

import br.com.mackinvest.business.Agencia;
import br.com.mackinvest.constants.Constants;
import br.com.mackinvest.exceptions.DadosNaoEncontradosException;
import br.com.mackinvest.exceptions.InvestimentoInvalidoException;
import br.com.mackinvest.model.Acao;
import br.com.mackinvest.model.Cliente;
import br.com.mackinvest.model.ContaCorrente;
import br.com.mackinvest.model.Fundo;
import br.com.mackinvest.model.Investimento;
import br.com.mackinvest.model.Poupanca;

public class MackInvestInvestimentosController extends MultiActionController
{
	public ModelAndView listarInvestimentos(HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		//Obtem a instancia unica da agencia
		Agencia agencia = Agencia.getInstanciaAgencia();
		HashMap<String, Object> propriedades = new HashMap<String, Object>();
		propriedades.put("acao","Investimentos Cadastrados");
		if(agencia.getInvestimentos() != null && !agencia.getInvestimentos().isEmpty()){
			propriedades.put("lista", agencia.getInvestimentos().values() );
		}else{
			propriedades.put("lista", null );
		}
		return new ModelAndView("investimentos/lista","propriedades",propriedades);
	}
	public ModelAndView consultarInvestimentos(HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		return new ModelAndView("investimentos/consulta");
	}
	public ModelAndView fazConsultaInvestimentos(HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		//Obtem a instancia unica da agencia
		Agencia agencia = Agencia.getInstanciaAgencia();
		String parametroConsulta = request.getParameter("textoConsulta");
		HashMap<String, Object> propriedades = new HashMap<String, Object>();
		
		propriedades.put("acao","Resultado da Consulta");
		propriedades.put("lista", agencia.getInvestimentos(parametroConsulta));		
		
		return new ModelAndView("investimentos/lista","propriedades",propriedades);
	}
	public ModelAndView editarInvestimento(HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		//Obtem a instancia unica da agencia
		Agencia agencia = Agencia.getInstanciaAgencia();
		int idInvestimento = Integer.parseInt(request.getParameter("id"));
		Investimento investimentoTMP = agencia.getInvestimento(idInvestimento);
		if(investimentoTMP == null){
			throw new DadosNaoEncontradosException("Investimento não encontrado!"); //Lança exceção pois não deveria ocorrer essas situação!
		}
		
		HashMap<String,Object> propriedades = new HashMap<String, Object>();
		propriedades.put("acao", "Editar");
		propriedades.put("investimento", investimentoTMP);
		
		return new ModelAndView("investimentos/editar","propriedades",propriedades);
	}
	public ModelAndView criarInvestimento(HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		HashMap<String,Object> propriedades = new HashMap<String, Object>();
		propriedades.put("acao", "Novo");
		propriedades.put("investimento", null);
		return new ModelAndView("investimentos/editar","propriedades",propriedades);
	}
	public ModelAndView modificarInvestimento(HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		//Obtem a instancia unica da agencia
		Agencia agencia = Agencia.getInstanciaAgencia();
		
		String descricao = request.getParameter("descricao");
		Float taxa = Float.parseFloat(request.getParameter("taxa"));
		boolean novo = request.getParameter("id") == null || request.getParameter("id").equals("");
		Investimento investimentoTMP;
		int idInvestimento;
		
		if(novo){
			//Novo Investimento
			String tipo = request.getParameter("tipo");
			investimentoTMP = new Investimento();
			if(tipo.equals(Constants.TIPO_INVESTIMENTO_ACAO)){
				investimentoTMP = new Acao();
			}else if(tipo.equals(Constants.TIPO_INVESTIMENTO_POUPANCA)){
				investimentoTMP = new Poupanca();
			}else if(tipo.equals(Constants.TIPO_INVESTIMENTO_FUNDO)){
				investimentoTMP = new Fundo();
			}else{
				throw new InvestimentoInvalidoException("Tipo de Investimento inválido!");
			}
			try{
				idInvestimento = agencia.getInvestimentos().lastKey() + 1;
			}catch(NoSuchElementException ex){
				idInvestimento = 1;
			}
			investimentoTMP.setId(idInvestimento);
		}else{
			idInvestimento = Integer.parseInt(request.getParameter("id"));
			investimentoTMP = agencia.getInvestimentos().get(idInvestimento);
			
		}
		investimentoTMP.setDescricao(descricao);
		investimentoTMP.setTaxaRendimento(taxa);

		if(novo)
			agencia.addInvestimento(investimentoTMP);
			
		return listarInvestimentos(request, response);
	}	
	public ModelAndView excluirInvestimento(HttpServletRequest request, HttpServletResponse response) throws Exception
	{
		//Obtem a instancia unica da agencia
		Agencia agencia = Agencia.getInstanciaAgencia();
		int idInvestimento = Integer.parseInt(request.getParameter("id"));
		agencia.removerInvestimento(idInvestimento);
		
		return listarInvestimentos(request, response);
	}
}
